"""
固件下载程序演示
展示如何使用固件下载核心功能
"""
#------------------从根目录开始查找app目录-------------------------
import sys
import os
ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
sys.path.insert(0, ROOT_DIR)  #这个root dir就是项目根目录


import time
from app.controller import DownloadController, UsbCanTransport, g_config
from app.utils.utils import Utils
from app.utils.log_ui import UILog

def progress_callback(progress: float, message: str):
    """进度回调函数"""
    UILog.INFO(f"进度: {progress:.1f}% - {message}")


def main():
    """主程序"""
    UILog.Open(True)
    UILog.INFO("=== 固件下载程序演示 ===")
    
    # 创建下载控制器（使用模拟传输层）
    transport = UsbCanTransport("usbcan")
    controller = DownloadController(transport)
    
    # 设置进度回调
    controller.set_progress_callback(progress_callback)
    
    try:
        # 1. 配置CAN参数
        UILog.INFO("\n1. 配置CAN参数...")
        g_config.update_can_config(
            tx_id=1,    # 发送CAN ID
            rx_id=1,    # 接收CAN ID
            baudrate=1000000  # 1Mbps
        )
        
        # 2. 初始化系统
        UILog.INFO("\n2. 初始化系统...")
        suc, msg = controller.init_system(g_config.can)
        if not suc:
            UILog.INFO(f"初始化失败: {msg}")
            return
        UILog.INFO(f"初始化成功: {msg}")
        
        # 3. 加载固件文件
        UILog.INFO("\n3. 加载固件文件...")
        # 这里使用一个假的固件文件路径作为演示
        # 实际使用时，需要提供真实的.s19或.hex文件路径
        firmware_path = Utils.get_root_dir() + "\CHLP-GNRC-STM32G0B1CBTx.s19"
        UILog.INFO(firmware_path)
        # 由于是演示，我们跳过实际的文件加载
        # 实际使用时取消注释以下代码：
        suc, msg = controller.load_firmware(firmware_path)
        if not suc:
            UILog.INFO(f"加载固件失败: {msg}")
            return
        UILog.INFO(f"加载固件成功: {msg}")
        UILog.INFO("固件加载演示（实际使用时需要真实的固件文件）")
        
        
        
        while True:
            
            # 4. 连接目标设备
            UILog.INFO("\n4. 连接目标设备...")
            suc, msg = controller.connect_target(timeout=1)
            if not suc:
                UILog.INFO(f"连接失败: {msg}")
                suc, msg = controller._reboot_target_app()
                if suc:
                    UILog.INFO(f"重启目标设备成功: {msg}")
                    
                    UILog.INFO("重启目标设备成功，等待1秒后连接目标设备")
                    time.sleep(0.1)
                    continue
                else:
                    UILog.INFO(f"重启目标设备失败: {msg}")
            else:         
                UILog.INFO(f"连接成功: {msg}")
                break
                
            time.sleep(0.5)
            
        
        
        # 5. 下载固件
        UILog.INFO("\n5. 开始固件下载...")

        suc, msg = controller.download_firmware()
        if not suc:
            UILog.INFO(f"下载失败: {msg}")
            return
        UILog.INFO(f"下载成功: {msg}")
        
        
        
        # 7. 获取固件信息
        UILog.INFO("\n7. 获取固件信息...")
 
        suc, info, msg = controller.get_firmware_info()
        if suc:
            UILog.INFO("固件信息:")
            for key, value in info.items():
                UILog.INFO(f"  {key}: {value}")
        else:
            UILog.ERROR(f"获取固件信息失败: {msg}")

        
        UILog.INFO("\n=== 下载完成 ===")
        
    except Exception as e:
        UILog.ERROR(f"程序异常: {str(e)}")
        
    finally:
        # 8. 清理资源
        UILog.INFO("\n8. 清理资源...")
        suc, msg = controller.deinit_system()
        if suc:
            UILog.INFO(f"清理成功: {msg}")
        else:
            UILog.ERROR(f"清理失败: {msg}")


if __name__ == "__main__":
    main() 